package controller;

import eccezioni.AmministratoreNonBannabileException;
import eccezioni.UtenteGiaBannatoException;
import eccezioni.UtenteGiaModeratoreException;
import eccezioni.UtenteNonAmministratoreException;
import eccezioni.UtenteNonModeratoreException;
import javax.ejb.Local;

/**
 * Metodi per i moderatori e l'amministratore
 * @author Ale
 */
@Local
public interface ControllerAmministrazioneLocal {

    /**
     * Crea l'amministratore del sistema, se non è già presente
     */
    public void creaAmministratore();

    /**
     * Banna un utente
     * @param bannando utente da bannare
     * @param bannatore moderatore/amministratore che esegue l'operazione
     * @throws UtenteNonModeratoreException se l'utente che esegue l'operazione non è almeno moderatore
     * @throws UtenteGiaBannatoException se l'utente da bannare è già stato bannato
     * @throws AmministratoreNonBannabileException se l'utente da bannare è amministratore e quindi non bannabile
     * @throws UtenteNonAmministratoreException se l'utente che cerca di bannare un moderatore non è l'amministratore
     */
    public void bannaUtente(entity.UtenteRegistrato bannando, entity.UtenteRegistrato bannatore) throws UtenteNonModeratoreException, UtenteGiaBannatoException, AmministratoreNonBannabileException, UtenteNonAmministratoreException;

    /**
     * Assegna d un utente semplice i privilegi di moderatore
     * @param utente utente a cui fornire i privilegi
     * @param amministratore l'amministratore dei sistema che dà i privilegi
     * @throws UtenteNonAmministratoreException se chi esegue l'operazione non è amministratore
     * @throws UtenteGiaModeratoreException se l'utente da elevare a moderatore è già moderatore
     */
    public void promuoviAModeratore(entity.UtenteRegistrato utente, entity.UtenteRegistrato amministratore) throws UtenteNonAmministratoreException, UtenteGiaModeratoreException;

    /**
     * Declassa un utente da moderatore a utente semplice.
     * @param utente moderatore da declassare
     * @param amministratore amministratore che declassa l'utente 
     * @throws UtenteNonAmministratoreException se chi esegue l'operazione non è amministratore
     * @throws UtenteNonModeratoreException se l'utente da declassare non è moderatore
     */
    public void declassaDaModeratore(entity.UtenteRegistrato utente, entity.UtenteRegistrato amministratore) throws UtenteNonAmministratoreException, UtenteNonModeratoreException;

    /**
     * Chiude un annuncio perché scaduto. 
     * Il metodo alla scadenza dell'annuncio marca tutte le adesioni e gli articoli 
     * non esplicitamente accettati come rifiutati, e notifica creatore e iscritti
     * @param a
     */
    public void chiudiAnnuncioScaduto(entity.Annuncio a);

    /**
     * Cancella un annuncio dal sistema
     * @param a annuncio da cancellare
     */
    public void cancellaAnnuncio(entity.Annuncio a);

    /**
     * Cancella un'adesione dal sistema
     * @param ad adesione da cancellare
     */
    public void cancellaAdesione(entity.Adesione ad);
        
}
